package main

import (
	"New-lesson-part2/cartorder_srv/biz"
	"New-lesson-part2/internal"

	"New-lesson-part2/proto/pb"
	"New-lesson-part2/util"
	"fmt"
	"github.com/google/uuid"
	consulapi "github.com/hashicorp/consul/api"
	"go.uber.org/zap"
	"google.golang.org/grpc"
	"google.golang.org/grpc/health"
	"google.golang.org/grpc/health/grpc_health_v1"
	"net"
)

//	/*
//		1.生成proto对应的文件,
//		2.简历biz目录,实现接口
//		3.拷贝之前的main文件的函数
//	*/

func main() {

	GenPort := util.GenRandomPort()
	addr := fmt.Sprintf("%s:%d", internal.AppConf.CartOrderConfig.Host, GenPort)

	server := grpc.NewServer()
	pb.RegisterShopCartServiceServer(server, &biz.ShopCartServer{}) //注册用的谁的结构体关联的方法,就用谁的结构体进行注册.
	listen, err := net.Listen("tcp", addr)
	if err != nil {
		zap.S().Error("ShopCart服务 启动异常", err.Error())
		panic(err)
	}
	grpc_health_v1.RegisterHealthServer(server, health.NewServer()) //将已经有的server注册到grpc的健康检查中
	defaultConfig := consulapi.DefaultConfig()                      //初始化默认consul配置
	defaultConfig.Address = fmt.Sprintf("%s:%d", internal.AppConf.ConsulConfig.Host, internal.AppConf.ConsulConfig.Port)

	client, err := consulapi.NewClient(defaultConfig) //生成consul注册对象
	if err != nil {
		zap.S().Error("consul.NewClient err:", err)
	}
	checkAddr := fmt.Sprintf("%s:%d", internal.AppConf.CartOrderConfig.Host, GenPort)
	//checkAddr 是注册服务的地址.不是consul的服务地址用于注册服务的监控检测
	randUUID := uuid.New().String() //这里生成随机id名称
	registration := consulapi.AgentServiceRegistration{
		ID:   randUUID,                                 //grpc服务的id.这里注意下.如果使用随机端口启动多个相同服务的时候.那么这个id号码需要不同.否则就是同一个服务id
		Name: internal.AppConf.CartOrderConfig.SrvName, //grpc服务的Name
		Tags: internal.AppConf.CartOrderConfig.Tags,    //grpc服务的Tags
		Port: GenPort,                                  //grpc服务的 端口号
		//Address: defaultConfig.Address,
		Address: internal.AppConf.CartOrderConfig.Host, //这里的地址是注册服务的地址.不是consul的地址.
		Check: &consulapi.AgentServiceCheck{
			Interval:                       "1s",      //监控检测间隔时间
			Timeout:                        "2s",      //监控检测超时时间
			GRPC:                           checkAddr, //grpc服务对应的地址和端口号
			DeregisterCriticalServiceAfter: "3s",      //超过这个时间后自动将注册服务从consul中删除 ..删除时间过长.会有缓存导致服务注册有问题.
		},
	} //告诉consul要注册服务的配置信息

	err = client.Agent().ServiceRegister(&registration)
	if err != nil {
		zap.S().Error("srv服务注册失败.", err)
	}
	fmt.Println("服务启动端口为:", GenPort)
	err = server.Serve(listen)
	if err != nil {
		panic(err)
	}
}
